package 数组.有效的山脉数组;

/**
 * @author: wh(1835734390 @ qq.com)
 * @date: 2023/2/23 16:55
 * @description:
 * @version:
 */
public class Solution {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,4,3,2};
        System.out.println(validMountainArray(array));
    }

    public static boolean validMountainArray(int[] arr) {
        if (arr.length < 3){
            return false;
        }
        //target为0表示上升期 1表示下降期
        int target = 0;
        for (int i = 1; i < arr.length; i++) {
            int slowIndex = i - 1;
            //如果上升过程中出现了下降，就将状态改为1下降
            if (arr[i] < arr[slowIndex] && target == 0){
                //如果一开始就下降，则返回错误
                if (i == 1){
                    return false;
                }
                target = 1;
                //如果在下降的过程出现上升的情况，则返回错误
            }else if (arr[i] > arr[slowIndex] && target == 1){
                return false;
                //如果出现相等的情况，立刻返回错误
            }else if (arr[i] == arr[slowIndex]){
                return false;
            }
        }
        if (target == 1){
            return true;
        }
        return false;
    }

    //官方题解，线性扫描
    public static boolean validMountainArray2(int[] arr) {
        int N = arr.length;
        int i = 0;

        // 递增扫描
        while (i + 1 < N && arr[i] < arr[i + 1]) {
            i++;
        }

        // 最高点不能是数组的第一个位置或最后一个位置
        if (i == 0 || i == N - 1) {
            return false;
        }

        // 递减扫描
        while (i + 1 < N && arr[i] > arr[i + 1]) {
            i++;
        }

        return i == N - 1;
    }

}
